package com.elitesland.b2c.com.service;

import com.elitesland.b2c.com.vo.param.ComAreaPageParamVO;
import com.elitesland.b2c.com.vo.resp.ComAreaBaseRespVO;
import com.elitesland.b2c.com.vo.resp.ComAreaDetailRespVO;
import com.elitesland.b2c.com.vo.resp.ComAreaTreeRespVO;
import com.elitesland.b2c.com.vo.save.ComAreaSaveVO;
import com.elitesland.core.base.ApiResult;
import com.elitesland.core.base.PagingVO;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 功能说明
 * </p>
 *
 * @author fred
 * @since 2021-02-01 17:29:32
 */
public interface ComAreaService {

    /**
     * 新增区域
     *
     * @param saveVO 区域保存对象
     * @return 区域ID
     */
    ApiResult<Long> save(ComAreaSaveVO saveVO);

    /**
     * 修改区域
     *
     * @param id     区域ID
     * @param saveVO 区域保存对象
     * @return 区域ID
     */
    ApiResult<Long> update(Long id, ComAreaSaveVO saveVO);

    /**
     * 切换是否启用状态
     *
     * @param id 区域ID
     * @return 区域ID
     */
    ApiResult<Long> updateEnable(Long id);

    /**
     * 修改启用禁用状态
     *
     * @param ids     区域ID
     * @param enabled 是否启用
     * @return 区域ID
     */
    ApiResult<List<Long>> updateEnable(List<Long> ids, Boolean enabled);

    /**
     * 删除区域信息
     *
     * @param id 区域ID
     * @return 区域ID
     */
    ApiResult<Long> delete(Long id);

    /**
     * 删除区域信息
     *
     * @param ids 区域ID
     * @return 区域ID
     */
    ApiResult<List<Long>> delete(List<Long> ids);

    /**
     * 根据ID获取区域详细信息
     *
     * @param id 区域ID
     * @return 区域信息
     */
    ApiResult<ComAreaDetailRespVO> get(Long id);

    /**
     * 判断是否都存在
     *
     * @param ids 待判断的地区ID
     * @return 是否都存在
     */
    ApiResult<Boolean> existsAll(List<Long> ids);

    /**
     * 获取地区名称
     *
     * @param ids 地区ID
     * @return 地区ID与名称的映射
     */
    ApiResult<Map<Long, String>> queryName(List<Long> ids);

    /**
     * 分页查询
     *
     * @param paramVO 分页查询参数
     * @return 查询结果
     */
    ApiResult<PagingVO<ComAreaDetailRespVO>> search(ComAreaPageParamVO paramVO);

    /**
     * 根据上级ID查询子区域信息
     *
     * @param parentId 上级ID
     * @param name     名称，可模糊查询
     * @return 区域信息
     */
    ApiResult<List<ComAreaBaseRespVO>> queryByParent(Long parentId, String name);

    /**
     * 获取所有地区的属性结果数据
     *
     * @return 树形数据
     */
    ApiResult<List<ComAreaTreeRespVO>> queryForTree();
}